//: C13:NoMemory.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// Constructor isn't called
// If new returns 0
#include <iostream>
#include <new> // size_t definition
using namespace std;

void my_new_handler()
{
    cout << "new handler called" << endl;
}

class NoMemory
{
public:
    NoMemory() {
        cout << "NoMemory::NoMemory()" << endl;
    }
    void* operator new(size_t sz) throw(bad_alloc) {
        cout << "NoMemory::operator new" << endl;
        throw bad_alloc(); // "Out of memory"
    }
};

int main()
{
    set_new_handler(my_new_handler);
    NoMemory* nm = new NoMemory;
    cout << "nm = " << nm << endl;
} ///:~
